package com.chinamsp.dydb.crud;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.chinamsp.dydb.mybatis.MapperInterface;
import com.chinamsp.dydb.mybatis.MybatisCRUDBuilder;
import com.chinamsp.dydb.query.Condition;
import com.chinamsp.dydb.query.OrderBy;
import com.chinamsp.dydb.query.Pagination;

/**
 * 数据库操作基类
 * 
 * <p>
 * 		封装了通用的dao操作方法，此接口中方法对应mapper都由 {@link MybatisCRUDBuilder} 生成
 * </p>
 * @author shifenghu
 *
 * @param <T>
 */
public interface BaseDao<T extends BaseModel> extends MapperInterface {

	
	/**
	 * 查询一批记录。
	 * @param page 分页信息
	 * @param conditions 条件
	 * @param orderBy 排序方式
	 * @return
	 */
	List<T> find(Pagination page, @Param("conditions") List<Condition> conditions, @Param("orderBys") List<OrderBy> orderBy);
	
	/**
	 * 为了防止主从同步时间延迟问题，这里将所有findById的请求都走主库
	 * @param id
	 * @return
	 */
	T findById(String id);

	/**
	 * 新增一条新的数据
	 * @param entity
	 * @return 影响行数
	 */
	int add(T entity);
	
	/**
	 * 更新数据
	 * @param entity
	 * @return 影响行数
	 */
	int update(T entity);

	/**
	 * 根据id删除数据
	 * @param id
	 * @return 影响行数
	 */
	int deleteById(String id);
	
	/**
	 * 根据id的集合删除一批记录
	 * @param ids
	 * @return 影响行数
	 */
	int deleteByIds(@Param("ids") List<String> ids);
	
	/**
	 * 把ids对应的实体中的属性值更新成entity中所有非null的属性值
	 * @param entity
	 * @param ids
	 * @return 影响行数
	 */
	int updateBatch(@Param("entity") T entity, @Param("ids") List<String> ids);
	
	/**
	 * 批量插入
	 * <p>
	 * 	该插入可以忽略重复性数据，即表中字段唯一约束，如果相同则忽略，不抛出异常,
	 * 	如果数据源是 oracle ，ignore 不支持，切 beans 必须保证所有字段都不能为null 
	 * </p>
	 * @param beans 要批量插入的实体列表
	 * @param ignore 是否忽略重复
	 * @return 影响行数
	 */
	int addBatch(@Param("beans") List<T> beans, @Param("ignore") boolean ignore);

	/**
	 * 根据 编号获取已经存在的编号
	 * @param ids
	 * @return
	 */
	List<String> findIdsByIds(@Param("ids") List<String> ids);
	
	/**
	 * 获取特定 id 的 field 值
	 * @param field
	 * @param id
	 * @return
	 */
	String findFieldValueById(@Param("fieldName") String field, @Param("id") String id);
	
	/**
	 * 查询符合特定条件的数据数量
	 * @param conditions 条件
	 * @return
	 */
	int findCount(@Param("conditions") List<Condition> conditions);
}
